package pe.com.bbva.modpre.ui;

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;

import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;

import pe.com.bbva.modpre.dominio.GrupoProducto;
import pe.com.bbva.modpre.dominio.Lista;
import pe.com.bbva.modpre.dominio.Producto;
import pe.com.bbva.modpre.dominio.TipoBanca;
import pe.com.bbva.modpre.dominio.Valor;
import pe.com.bbva.modpre.negocio.ConfiguracionService;
import pe.com.bbva.modpre.negocio.SolicitudService;
import pe.com.bbva.modpre.utileria.Inject;
import pe.com.bbva.modpre.utileria.ModpreUtil;
import pe.com.bbva.modpre.utileria.TablaFiltro;

import com.vaadin.annotations.AutoGenerated;
import com.vaadin.data.Item;
import com.vaadin.data.Property.ValueChangeEvent;
import com.vaadin.data.Property.ValueChangeListener;
import com.vaadin.data.util.BeanItemContainer;
import com.vaadin.data.util.IndexedContainer;
import com.vaadin.terminal.gwt.server.WebApplicationContext;
import com.vaadin.terminal.gwt.server.WebBrowser;
import com.vaadin.ui.Button;
import com.vaadin.ui.Button.ClickEvent;
import com.vaadin.ui.Button.ClickListener;
import com.vaadin.ui.ComboBox;
import com.vaadin.ui.CustomComponent;
import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.Panel;
import com.vaadin.ui.TextArea;
import com.vaadin.ui.TextField;
import com.vaadin.ui.VerticalLayout;

@SuppressWarnings("serial")
public class AdministrarProductoUI extends CustomComponent implements ClickListener {

	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */

	@AutoGenerated
	private VerticalLayout mainLayout;
	@AutoGenerated
	private HorizontalLayout mainLayoutContainer;
	@AutoGenerated
	private VerticalLayout lytProductoFormulario;
	@AutoGenerated
	private HorizontalLayout lytBotonera;
	@AutoGenerated
	private Button btnEliminar;
	@AutoGenerated
	private Button btnGuardar;
	@AutoGenerated
	private ComboBox cmbEstado;
	@AutoGenerated
	private TextField txtPeso;
	@AutoGenerated
	private TextField txtRatioEficiencia;
	@AutoGenerated
	private TextField txtTipoImpositivo;
	@AutoGenerated
	private TextField txtComision;
	@AutoGenerated
	private TextField txtCadic;
	@AutoGenerated
	private ComboBox cmbTipoBanca;
	@AutoGenerated
	private ComboBox cmbGrupoProducto;
	@AutoGenerated
	private TextArea txtADescripcion;
	@AutoGenerated
	private TextField txtNombreCorto;
	@AutoGenerated
	private TextField txtNombre;
	@AutoGenerated
	private TextField txtCodigo;
	@AutoGenerated
	private VerticalLayout lytProducto;
	@AutoGenerated
	private Panel pnlProducto;
	@AutoGenerated
	private VerticalLayout lytPanelProducto;
	@AutoGenerated
	private TablaFiltro tblProducto;
	/**
	 * The constructor should first build the main layout, set the
	 * composition root and then do any custom initialization.
	 *
	 * The constructor will not be automatically regenerated by the
	 * visual editor.
	 */
	@Autowired
	ConfiguracionService configuracionService;
	@Autowired
	SolicitudService solicitudService;
	
	IndexedContainer container;
	
	public AdministrarProductoUI() {
		buildMainLayout();
		setCompositionRoot(mainLayout);
		Inject.inject(this);
		postConstruct();
	}
	
	@Override
	public void attach() {
		super.attach();
		WebApplicationContext context = ((WebApplicationContext) getApplication().getContext());
		WebBrowser webBrowser = context.getBrowser();
		tblProducto.setWebBrowser(webBrowser);
		container=new IndexedContainer();
		
		container.addContainerProperty("codigo", String.class, null);
		container.addContainerProperty("nombre", String.class, null);
		container.addContainerProperty("nombreCorto", String.class, null);
		container.addContainerProperty("grupoProducto", String.class, null);
		container.addContainerProperty("tipoBanca", String.class, null);
		container.addContainerProperty("cadic", BigDecimal.class, null);
		container.addContainerProperty("comision", BigDecimal.class, null);
		container.addContainerProperty("tipoImpositivo", BigDecimal.class, null);
		container.addContainerProperty("ratioEficiencia", BigDecimal.class, null);
		container.addContainerProperty("peso", BigDecimal.class, null);
		container.addContainerProperty("estado", String.class, null);
		container.addContainerProperty("producto", Producto.class, null);
		tblProducto.setContainerDataSource(container);
		
		tblProducto.setVisibleColumns(new Object[]{"codigo","nombre","nombreCorto","grupoProducto",
				"tipoBanca","cadic","comision","tipoImpositivo","ratioEficiencia","peso","estado"});
		
		tblProducto.setColumnHeader("codigo", "Codigo");
		tblProducto.setColumnHeader("nombre", "Nombre");
		tblProducto.setColumnHeader("nombreCorto", "Nombre Corto");
		tblProducto.setColumnHeader("grupoProducto", "Grupo Producto");
		tblProducto.setColumnHeader("tipoBanca", "Tipo Banca");
		tblProducto.setColumnHeader("cadic", "Cadic");
		tblProducto.setColumnHeader("comision", "Comision");
		tblProducto.setColumnHeader("tipoImpositivo", "Tipo Impositivo");
		tblProducto.setColumnHeader("ratioEficiencia", "Ratio Eficiencia");
		tblProducto.setColumnHeader("peso", "Peso");
		tblProducto.setColumnHeader("estado", "Estado");
		
		tblProducto.setColumnWidth("codigo", 80);
		tblProducto.setColumnWidth("nombre", 80);
		tblProducto.setColumnWidth("nombreCorto", 80);
		tblProducto.setColumnWidth("grupoProducto", 80);
		tblProducto.setColumnWidth("tipoBanca", 80);
		tblProducto.setColumnWidth("cadic", 80);
		tblProducto.setColumnWidth("comision", 80);
		tblProducto.setColumnWidth("tipoImpositivo", 80);
		tblProducto.setColumnWidth("ratioEficiencia", 80);
		tblProducto.setColumnWidth("peso", 80);
		tblProducto.setColumnWidth("estado", 80);
		tblProducto.setSelectable(true);
		tblProducto.setImmediate(true);
		tblProducto.setNullSelectionAllowed(true);
		tblProducto.setNullSelectionItemId(null);
		tblProducto.setColumnReorderingAllowed(false);
		tblProducto.setColumnCollapsingAllowed(false);
		tblProducto.cargarTabla();
		tblProducto.addListener(new ValueChangeListener() {
			
			@Override
			public void valueChange(ValueChangeEvent event) {
				if(tblProducto.getValue() == null){
					limpiar();
				}
				else
				{
					btnGuardar.setCaption("Actualizar");
					btnEliminar.setVisible(true);
					Item item = tblProducto.getItem(tblProducto.getValue());
					Producto producto=(Producto)item.getItemProperty("producto").getValue();
					txtCodigo.setValue(producto.getCodigo());
					txtNombre.setValue(producto.getNombre());
					txtNombreCorto.setValue(producto.getNombreCorto());
					txtADescripcion.setValue(producto.getDescripcion());
					cmbGrupoProducto.setValue(producto.getGrupoProducto());
					cmbTipoBanca.setValue(producto.getTipoBanca());
					txtCadic.setValue(producto.getCadic());
					txtComision.setValue(producto.getComision());
					txtTipoImpositivo.setValue(producto.getTipoImpositivo());
					txtRatioEficiencia.setValue(producto.getRatioEficiencia());
					txtPeso.setValue(producto.getPeso());
					cmbEstado.setValue(producto.getEstado());
				}
			}
		});
		cargarDataTabla(null);
	}

	public void postConstruct(){
		lytPanelProducto.setSizeUndefined();
		lytPanelProducto.setHeight("100%");
		
		txtCodigo.setNullRepresentation(StringUtils.EMPTY);
		txtNombre.setNullRepresentation(StringUtils.EMPTY);
		txtNombreCorto.setNullRepresentation(StringUtils.EMPTY);
		txtADescripcion.setNullRepresentation(StringUtils.EMPTY);
		txtCadic.setNullRepresentation(StringUtils.EMPTY);
		txtCadic.setStyleName("decimal");
		txtComision.setNullRepresentation(StringUtils.EMPTY);
		txtComision.setStyleName("decimal");
		txtTipoImpositivo.setNullRepresentation(StringUtils.EMPTY);
		txtTipoImpositivo.setStyleName("decimal");
		txtRatioEficiencia.setNullRepresentation(StringUtils.EMPTY);
		txtRatioEficiencia.setStyleName("decimal");
		txtPeso.setNullRepresentation(StringUtils.EMPTY);
		txtPeso.setStyleName("decimal");
		
		List<GrupoProducto> grupoProductos = solicitudService.buscarGrupoProducto();
		BeanItemContainer<GrupoProducto> bicGrupoProductos = new BeanItemContainer<GrupoProducto>(GrupoProducto.class,  grupoProductos);
		cmbGrupoProducto.setContainerDataSource(bicGrupoProductos);
		cmbGrupoProducto.setItemCaptionPropertyId("nombre");
		cmbGrupoProducto.setInputPrompt("Grupo Producto");
		List<TipoBanca> tipoBancas = solicitudService.buscarTipoBanca();
		BeanItemContainer<TipoBanca> bicTipoBancas = new BeanItemContainer<TipoBanca>(TipoBanca.class,  tipoBancas);
		cmbTipoBanca.setContainerDataSource(bicTipoBancas);
		cmbTipoBanca.setItemCaptionPropertyId("nombre");
		cmbTipoBanca.setInputPrompt("Tipo Banca");
		List<Valor> estados = configuracionService.obtenerValoresxLista(Lista.CODIGO.REGISTRO_ESTADO);
		BeanItemContainer<Valor> bicEstados = new BeanItemContainer<Valor>(Valor.class,  estados);
		cmbEstado.setContainerDataSource(bicEstados);
		cmbEstado.setItemCaptionPropertyId("nombre");
		cmbEstado.setInputPrompt("Estado");
		
		btnGuardar.addListener(this);
		btnEliminar.addListener(this);
		btnEliminar.setVisible(false);
		
	}

	public void cargarDataTabla(Map<String,Object> map){
		tblProducto.removeAllItems();
		
		List<Producto> productos=solicitudService.buscarProductos(map);
		
		int con=1;
		for(Producto producto : productos){
			Item item = container.addItem(con);
			item.getItemProperty("codigo").setValue(producto.getCodigo());
			item.getItemProperty("nombre").setValue(producto.getNombre());
			item.getItemProperty("nombreCorto").setValue(producto.getNombreCorto());
			item.getItemProperty("grupoProducto").setValue(producto.getGrupoProducto()==null?null : producto.getGrupoProducto().getNombre());
			item.getItemProperty("tipoBanca").setValue(producto.getTipoBanca()==null?null : producto.getTipoBanca().getNombre());
			item.getItemProperty("cadic").setValue(producto.getCadic());
			item.getItemProperty("comision").setValue(producto.getComision());
			item.getItemProperty("tipoImpositivo").setValue(producto.getTipoImpositivo());
			item.getItemProperty("ratioEficiencia").setValue(producto.getRatioEficiencia());
			item.getItemProperty("peso").setValue(producto.getPeso());
			item.getItemProperty("estado").setValue(producto.getEstado()==null?null : producto.getEstado().getNombre());
			item.getItemProperty("producto").setValue(producto);
			con++;	
		}
	}
	
	public void limpiar(){
		btnEliminar.setVisible(false);
		btnGuardar.setCaption("Crear");
		txtCodigo.setValue(null);
		txtNombre.setValue(null);
		txtNombreCorto.setValue(null);
		txtADescripcion.setValue(null);
		cmbGrupoProducto.setValue(null);
		cmbTipoBanca.setValue(null);
		txtCadic.setValue(null);
		txtComision.setValue(null);
		txtTipoImpositivo.setValue(null);
		txtRatioEficiencia.setValue(null);
		txtPeso.setValue(null);
		cmbEstado.setValue(null);
	}
	
	@Override
	public void buttonClick(ClickEvent event) {
		if(event.getButton().equals(btnGuardar))
		{
			buttonGuardar();
		}
		if(event.getButton().equals(btnEliminar))
		{
			buttonEliminar();
		}
	}
	
	private void buttonGuardar() {
		Item item = tblProducto.getItem(tblProducto.getValue());
		Producto producto=new Producto();
		if(item!=null){
			producto=(Producto)item.getItemProperty("producto").getValue();
		}
		producto.setCodigo((String)txtCodigo.getValue());
		producto.setNombre((String)txtNombre.getValue());
		producto.setNombreCorto((String)txtNombreCorto.getValue());
		producto.setDescripcion((String)txtADescripcion.getValue());
		producto.setGrupoProducto((GrupoProducto)cmbGrupoProducto.getValue());
		producto.setTipoBanca((TipoBanca)cmbTipoBanca.getValue());
		producto.setCadic(ModpreUtil.convertirObjetoBigDecimal(txtCadic.getValue()));
		producto.setComision(ModpreUtil.convertirObjetoBigDecimal(txtComision.getValue()));
		producto.setTipoImpositivo(ModpreUtil.convertirObjetoBigDecimal(txtTipoImpositivo.getValue()));
		producto.setRatioEficiencia(ModpreUtil.convertirObjetoBigDecimal(txtRatioEficiencia.getValue()));
		producto.setPeso(ModpreUtil.convertirObjetoBigDecimal(txtPeso.getValue()));
		producto.setEstado((Valor)cmbEstado.getValue());
		configuracionService.guardarProducto(producto);
		limpiar();
		cargarDataTabla(null);
	}
	
	private void buttonEliminar() {
		Item item = tblProducto.getItem(tblProducto.getValue());
		Producto producto=(Producto)item.getItemProperty("producto").getValue();
		configuracionService.eliminarProducto(producto.getId());
		limpiar();
		cargarDataTabla(null);
	}
	
	@AutoGenerated
	private VerticalLayout buildMainLayout() {
		// common part: create layout
		mainLayout = new VerticalLayout();
		mainLayout.setImmediate(false);
		mainLayout.setWidth("100%");
		mainLayout.setHeight("100%");
		mainLayout.setMargin(false);
		
		// top-level component properties
		setWidth("100.0%");
		setHeight("100.0%");
		
		// mainLayoutContainer
		mainLayoutContainer = buildMainLayoutContainer();
		mainLayout.addComponent(mainLayoutContainer);
		
		return mainLayout;
	}

	@AutoGenerated
	private HorizontalLayout buildMainLayoutContainer() {
		// common part: create layout
		mainLayoutContainer = new HorizontalLayout();
		mainLayoutContainer.setImmediate(false);
		mainLayoutContainer.setWidth("-1px");
		mainLayoutContainer.setHeight("-1px");
		mainLayoutContainer.setMargin(false);
		
		// lytProducto
		lytProducto = buildLytProducto();
		mainLayoutContainer.addComponent(lytProducto);
		
		// lytProductoFormulario
		lytProductoFormulario = buildLytProductoFormulario();
		mainLayoutContainer.addComponent(lytProductoFormulario);
		
		return mainLayoutContainer;
	}

	@AutoGenerated
	private VerticalLayout buildLytProducto() {
		// common part: create layout
		lytProducto = new VerticalLayout();
		lytProducto.setImmediate(false);
		lytProducto.setWidth("-1px");
		lytProducto.setHeight("-1px");
		lytProducto.setMargin(false);
		
		// pnlProducto
		pnlProducto = buildPnlProducto();
		lytProducto.addComponent(pnlProducto);
		
		return lytProducto;
	}

	@AutoGenerated
	private Panel buildPnlProducto() {
		// common part: create layout
		pnlProducto = new Panel();
		pnlProducto.setImmediate(false);
		pnlProducto.setWidth("750px");
		pnlProducto.setHeight("450px");
		
		// lytPanelProducto
		lytPanelProducto = buildLytPanelProducto();
		pnlProducto.setContent(lytPanelProducto);
		
		return pnlProducto;
	}

	@AutoGenerated
	private VerticalLayout buildLytPanelProducto() {
		// common part: create layout
		lytPanelProducto = new VerticalLayout();
		lytPanelProducto.setImmediate(false);
		lytPanelProducto.setWidth("100.0%");
		lytPanelProducto.setHeight("100.0%");
		lytPanelProducto.setMargin(false);
		
		// tblProducto
		tblProducto = new TablaFiltro(){
			
			@Override
			public void enter() {
				cargarDataTabla(tblProducto.obtenerFiltros());
			}
			
		};
		tblProducto.setImmediate(false);
		tblProducto.setWidth("100.0%");
		tblProducto.setHeight("100.0%");
		lytPanelProducto.addComponent(tblProducto);
		lytPanelProducto.setExpandRatio(tblProducto, 1.0f);
		
		return lytPanelProducto;
	}

	@AutoGenerated
	private VerticalLayout buildLytProductoFormulario() {
		// common part: create layout
		lytProductoFormulario = new VerticalLayout();
		lytProductoFormulario.setImmediate(false);
		lytProductoFormulario.setWidth("-1px");
		lytProductoFormulario.setHeight("-1px");
		lytProductoFormulario.setMargin(true);
		lytProductoFormulario.setSpacing(true);
		
		// txtCodigo
		txtCodigo = new TextField();
		txtCodigo.setImmediate(false);
		txtCodigo.setWidth("200px");
		txtCodigo.setHeight("-1px");
		txtCodigo.setInputPrompt("Codigo");
		lytProductoFormulario.addComponent(txtCodigo);
		
		// txtNombre
		txtNombre = new TextField();
		txtNombre.setImmediate(false);
		txtNombre.setWidth("200px");
		txtNombre.setHeight("-1px");
		txtNombre.setInputPrompt("Nombre");
		lytProductoFormulario.addComponent(txtNombre);
		
		// txtNombreCorto
		txtNombreCorto = new TextField();
		txtNombreCorto.setImmediate(false);
		txtNombreCorto.setWidth("200px");
		txtNombreCorto.setHeight("-1px");
		txtNombreCorto.setInputPrompt("Nombre Corto");
		lytProductoFormulario.addComponent(txtNombreCorto);
		
		// txtADescripcion
		txtADescripcion = new TextArea();
		txtADescripcion.setImmediate(false);
		txtADescripcion.setWidth("200px");
		txtADescripcion.setHeight("100px");
		txtADescripcion.setInputPrompt("Descripcion");
		lytProductoFormulario.addComponent(txtADescripcion);
		
		// cmbGrupoProducto
		cmbGrupoProducto = new ComboBox();
		cmbGrupoProducto.setImmediate(false);
		cmbGrupoProducto.setWidth("200px");
		cmbGrupoProducto.setHeight("-1px");
		lytProductoFormulario.addComponent(cmbGrupoProducto);
		
		// cmbTipoBanca
		cmbTipoBanca = new ComboBox();
		cmbTipoBanca.setImmediate(false);
		cmbTipoBanca.setWidth("200px");
		cmbTipoBanca.setHeight("-1px");
		lytProductoFormulario.addComponent(cmbTipoBanca);
		
		// txtCadic
		txtCadic = new TextField();
		txtCadic.setImmediate(false);
		txtCadic.setWidth("200px");
		txtCadic.setHeight("-1px");
		txtCadic.setInputPrompt("Cadic");
		lytProductoFormulario.addComponent(txtCadic);
		
		// txtComision
		txtComision = new TextField();
		txtComision.setImmediate(false);
		txtComision.setWidth("200px");
		txtComision.setHeight("-1px");
		txtComision.setInputPrompt("Comision");
		lytProductoFormulario.addComponent(txtComision);
		
		// txtTipoImpositivo
		txtTipoImpositivo = new TextField();
		txtTipoImpositivo.setImmediate(false);
		txtTipoImpositivo.setWidth("200px");
		txtTipoImpositivo.setHeight("-1px");
		txtTipoImpositivo.setInputPrompt("Tipo Impositivo");
		lytProductoFormulario.addComponent(txtTipoImpositivo);
		
		// txtRatioEficiencia
		txtRatioEficiencia = new TextField();
		txtRatioEficiencia.setImmediate(false);
		txtRatioEficiencia.setWidth("200px");
		txtRatioEficiencia.setHeight("-1px");
		txtRatioEficiencia.setInputPrompt("Ratio Eficiencia");
		lytProductoFormulario.addComponent(txtRatioEficiencia);
		
		// txtPeso
		txtPeso = new TextField();
		txtPeso.setImmediate(false);
		txtPeso.setWidth("200px");
		txtPeso.setHeight("-1px");
		txtPeso.setInputPrompt("Peso");
		lytProductoFormulario.addComponent(txtPeso);
		
		// cmbEstado
		cmbEstado = new ComboBox();
		cmbEstado.setImmediate(false);
		cmbEstado.setWidth("200px");
		cmbEstado.setHeight("-1px");
		lytProductoFormulario.addComponent(cmbEstado);
		
		// lytBotonera
		lytBotonera = buildLytBotonera();
		lytProductoFormulario.addComponent(lytBotonera);
		
		return lytProductoFormulario;
	}

	@AutoGenerated
	private HorizontalLayout buildLytBotonera() {
		// common part: create layout
		lytBotonera = new HorizontalLayout();
		lytBotonera.setImmediate(false);
		lytBotonera.setWidth("-1px");
		lytBotonera.setHeight("-1px");
		lytBotonera.setMargin(false);
		lytBotonera.setSpacing(true);
		
		// btnGuardar
		btnGuardar = new Button();
		btnGuardar.setCaption("Crear");
		btnGuardar.setImmediate(true);
		btnGuardar.setWidth("-1px");
		btnGuardar.setHeight("-1px");
		lytBotonera.addComponent(btnGuardar);
		
		// btnEliminar
		btnEliminar = new Button();
		btnEliminar.setCaption("Eliminar");
		btnEliminar.setImmediate(true);
		btnEliminar.setWidth("-1px");
		btnEliminar.setHeight("-1px");
		lytBotonera.addComponent(btnEliminar);
		
		return lytBotonera;
	}

}
